#include "Main.h"
#include "student_pub.h"
#include "course_pub.h"
#include "fileio_pub.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef FROM_FILE
    #define INIT_MODE_STR "文件初始化模式"
#else
    #define INIT_MODE_STR "命令行初始化模式"
#endif

// 显示主菜单
void show_menu() {
    printf("\n==========================================\n");
    printf("   学生选课管理系统 - %s\n", INIT_MODE_STR);
    printf("==========================================\n");
    printf("1. 学生信息管理\n");
    printf("2. 课程信息管理\n");
    printf("3. 选课操作\n");
    printf("4. 退课操作\n");
    printf("5. 查看所有信息\n");
    printf("6. 保存数据\n");
    printf("7. 手动输入模式\n");
    printf("0. 退出系统\n");
    printf("==========================================\n");
    printf("请选择操作: ");
}

// 选课菜单
void select_course_menu() {
    char student_id[MAX_ID_LEN];
    char course_id[MAX_ID_LEN];
    
    printf("\n=== 选课操作 ===\n");
    printf("请输入学号: ");
    fgets(student_id, sizeof(student_id), stdin);
    student_id[strcspn(student_id, "\n")] = 0;
    
    printf("请输入课程编号: ");
    fgets(course_id, sizeof(course_id), stdin);
    course_id[strcspn(course_id, "\n")] = 0;
    
    // 检查学生是否存在
    extern Student* find_student_by_id(const char*);
    Student* student = find_student_by_id(student_id);
    if (student == NULL) {
        printf("学号不存在: %s\n", student_id);
        return;
    }
    
    // 检查课程是否存在
    extern Course* find_course_by_id(const char*);
    Course* course = find_course_by_id(course_id);
    if (course == NULL) {
        printf(" 课程不存在: %s\n", course_id);
        return;
    }
    
    // 检查是否已选该课程
    for (int i = 0; i < student->course_count; i++) {
        if (strcmp(student->courses[i], course_id) == 0) {
            printf(" 学生 %s 已经选过课程 %s\n", student_id, course_id);
            return;
        }
    }
    
    // 检查课程是否已满
    extern int can_enroll(const char*);
    if (!can_enroll(course_id)) {
        printf(" 课程 %s 已满，无法选课\n", course_id);
        return;
    }
    
    // 执行选课操作
    extern int enroll_student_in_course(const char*, const char*);
    if (enroll_student_in_course(course_id, student_id)) {
        // 更新学生的选课列表
        if (student->course_count < MAX_COURSES_PER_STUDENT) {
            strcpy(student->courses[student->course_count], course_id);
            student->course_count++;
            
            // 更新学生总学分
            extern float get_course_credit(const char*);
            float credit = get_course_credit(course_id);
            student->total_credits += credit;
            
            printf(" 选课成功！学生 %s 已选课程 %s\n", student_id, course_id);
            log_operation("SELECT_COURSE", student_id, course_id);
        }
    }
}

// 退课菜单
void drop_course_menu() {
    char student_id[MAX_ID_LEN];
    char course_id[MAX_ID_LEN];
    
    printf("\n=== 退课操作 ===\n");
    printf("请输入学号: ");
    fgets(student_id, sizeof(student_id), stdin);
    student_id[strcspn(student_id, "\n")] = 0;
    
    printf("请输入课程编号: ");
    fgets(course_id, sizeof(course_id), stdin);
    course_id[strcspn(course_id, "\n")] = 0;
    
    // 检查学生是否存在
    extern Student* find_student_by_id(const char*);
    Student* student = find_student_by_id(student_id);
    if (student == NULL) {
        printf(" 学号不存在: %s\n", student_id);
        return;
    }
    
    // 检查是否选了该课程
    int found = 0;
    int course_index = -1;
    for (int i = 0; i < student->course_count; i++) {
        if (strcmp(student->courses[i], course_id) == 0) {
            found = 1;
            course_index = i;
            break;
        }
    }
    
    if (!found) {
        printf(" 学生 %s 未选课程 %s\n", student_id, course_id);
        return;
    }
    
    // 执行退课操作
    extern int remove_student_from_course(const char*, const char*);
    if (remove_student_from_course(course_id, student_id)) {
        // 从学生的选课列表中移除课程
        if (course_index < student->course_count - 1) {
            strcpy(student->courses[course_index], 
                   student->courses[student->course_count - 1]);
        }
        student->course_count--;
        
        // 更新学生总学分
        extern float get_course_credit(const char*);
        float credit = get_course_credit(course_id);
        student->total_credits -= credit;
        if (student->total_credits < 0) {
            student->total_credits = 0;
        }
        
        printf(" 退课成功！学生 %s 已退选课程 %s\n", student_id, course_id);
        log_operation("DROP_COURSE", student_id, course_id);
    }
}

// 查看所有信息
void show_all_info() {
    printf("\n=== 系统信息总览 ===\n");
    
    // 显示学生信息
    extern void list_all_students();
    list_all_students();
    
    // 显示课程信息
    extern void list_all_courses();
    list_all_courses();
    
    printf("\n 统计信息:\n");
    extern int get_student_count();
    extern int get_course_count();
    printf("- 学生总数: %d\n", get_student_count());
    printf("- 课程总数: %d\n", get_course_count());
}

// 手动输入模式
void manual_input_mode() {
    #ifdef FROM_FILE
    printf("\n 当前为文件模式，手动输入的数据不会保存到文件\n");
    printf("如需保存，请在退出前选择'保存数据'选项\n");
    #endif
    
    int choice;
    printf("\n=== 手动输入模式 ===\n");
    printf("1. 手动添加学生\n");
    printf("2. 手动添加课程\n");
    printf("0. 返回主菜单\n");
    printf("请选择: ");
    
    scanf("%d", &choice);
    getchar();
    
    switch (choice) {
        case 1: {
            char id[MAX_ID_LEN], name[MAX_NAME_LEN];
            printf("请输入学号: ");
            fgets(id, sizeof(id), stdin);
            id[strcspn(id, "\n")] = 0;
            
            printf("请输入姓名: ");
            fgets(name, sizeof(name), stdin);
            name[strcspn(name, "\n")] = 0;
            
            extern int add_student(const char*, const char*);
            if (add_student(id, name)) {
                printf(" 手动添加学生成功\n");
            }
            break;
        }
        case 2: {
            char id[MAX_ID_LEN], name[MAX_NAME_LEN], type[MAX_TYPE_LEN];
            int hours, max_enrollment;
            float credit;
            
            printf("请输入课程编号: ");
            fgets(id, sizeof(id), stdin);
            id[strcspn(id, "\n")] = 0;
            
            printf("请输入课程名称: ");
            fgets(name, sizeof(name), stdin);
            name[strcspn(name, "\n")] = 0;
            
            printf("请输入课程性质: ");
            fgets(type, sizeof(type), stdin);
            type[strcspn(type, "\n")] = 0;
            
            printf("请输入授课学时: ");
            scanf("%d", &hours);
            
            printf("请输入学分: ");
            scanf("%f", &credit);
            
            printf("请输入最大选课人数: ");
            scanf("%d", &max_enrollment);
            getchar();
            
            extern int add_course(const char*, const char*, const char*, int, float, int);
            if (add_course(id, name, type, hours, credit, max_enrollment)) {
                printf(" 手动添加课程成功\n");
            }
            break;
        }
        case 0:
            return;
        default:
            printf(" 无效选择\n");
    }
}

// 主函数
int main() {
    printf("==========================================\n");
    printf("   学生选课管理系统 启动中...\n");
    printf("==========================================\n");
    
    // 初始化各模块
    init_student_manager();
    init_course_manager();
    setup_logging();
    
    #ifdef FROM_FILE
    // 文件模式：从文件加载数据
    printf(" 运行模式: 文件初始化\n");
    load_students_from_file("student.txt");
    load_courses_from_file("course.txt");
    #else
    // 命令行模式
    printf(" 运行模式: 命令行初始化\n");
    printf(" 提示: 您需要手动输入学生和课程信息\n");
    #endif
    
    printf(" 系统初始化完成\n");
    
    int choice;
    char buffer[100];
    
    while (1) {
        show_menu();
        
        if (scanf("%d", &choice) != 1) {
            // 输入不是数字，清除输入缓冲区
            printf(" 请输入数字！\n");
            while (getchar() != '\n'); // 清除输入缓冲区
            continue;
        }
        getchar(); // 清除换行符
        
        switch (choice) {
            case 1:
                student_management_menu();
                break;
            case 2:
                course_management_menu();
                break;
            case 3:
                select_course_menu();
                break;
            case 4:
                drop_course_menu();
                break;
            case 5:
                show_all_info();
                break;
            case 6:
                #ifdef FROM_FILE
                save_students_to_file("student.txt");
                save_courses_to_file("course.txt");
                printf(" 数据已保存到文件\n");
                #else
                printf(" 当前为命令行模式，数据不会保存到文件\n");
                printf(" 提示: 重新编译为文件模式以启用自动保存\n");
                #endif
                break;
            case 7:
                manual_input_mode();
                break;
            case 0:
                #ifdef FROM_FILE
                // 退出前保存数据
                save_students_to_file("student.txt");
                save_courses_to_file("course.txt");
                #endif
                printf("\n==========================================\n");
                printf("   感谢使用学生选课管理系统！\n");
                printf("           再见!\n");
                printf("==========================================\n");
                return 0;
            default:
                printf(" 无效选择，请重新输入！\n");
        }
    }
    
    return 0;
}
